package com.practice.designMode.Decorator;

import java.util.HashSet;
import java.util.Set;

/**
 * 装饰器模式（Decorator Pattern）是一种结构型设计模式，它允许动态地给一个对象添加额外的功能，而无需修改其结构。
 * 装饰器模式通过创建一个包含原始对象的容器对象来实现，从而在运行时动态地为对象添加新的行为。
 * 1. 装饰器模式的结构
 * 装饰器模式主要包含以下角色：
 * 抽象组件（Component）：定义了被装饰对象的接口，所有具体组件和装饰器都实现这个接口。
 * 具体组件（Concrete Component）：实现了抽象组件接口，定义了具体的对象。
 * 装饰器抽象类（Decorator）：也实现了抽象组件接口，内部包含一个对抽象组件的引用，用于动态地添加职责。
 * 具体装饰器（Concrete Decorator）：继承自装饰器抽象类，实现具体的装饰逻辑。
 * 2. 装饰器模式的工作原理
 * 装饰器模式的工作原理如下：
 * 抽象组件定义了被装饰对象的接口，具体组件实现了这个接口。
 * 装饰器抽象类也实现了抽象组件接口，内部包含一个对抽象组件的引用，用于动态地添加职责。
 * 具体装饰器继承自装饰器抽象类，实现具体的装饰逻辑。
 * 3. 装饰器模式的优点
 * 装饰器模式具有以下优点：
 * 动态扩展：装饰器模式可以在运行时动态地为对象添加新的行为，而不需要修改其结构。
 * 灵活性：装饰器模式可以根据需要添加或移除装饰器，从而实现不同的功能组合。
 * 可复用性：装饰器模式可以将装饰逻辑封装在具体装饰器中，从而实现代码的复用。
 * 4. 装饰器模式的缺点
 * 装饰器模式也存在一些缺点：
 * 复杂性：装饰器模式引入了额外的类和对象，可能会增加系统的复杂性。
 * 性能开销：由于装饰器模式需要在运行时动态地添加职责，可能会导致性能开销。
 * 5. 装饰器模式的应用场景
 * 装饰器模式适用于以下场景：
 * 需要动态地给一个对象添加额外的功能，而无需修改其结构。
 * 需要在运行时动态地为对象添加新的行为，而不需要修改其结构。
 * 需要将功能分解为多个装饰器，从而实现代码的复用。
 * 6. 装饰器模式的注意事项
 * 在使用装饰器模式时，需要注意以下事项：
 * 避免过多的装饰器：装饰器模式可能会导致系统中出现过多的类和对象，可能会增加系统的复杂性。
 */
public class Test {
    public static void main(String[] args) {
        Set<String> set = new MySet<>(new HashSet<>());
        set.add("1");
        set.add("2");
        set.add("3");
        set.add("4");
        set.remove("2");
        set.remove("2");
        set.remove("3");
        set.remove("1");
        System.out.println(set);
    }
}
